package com.chenchao.method;

/**
 * @encoding : UTF-8
 * @Time : 2020/11/17 16:14
 * @Author : Chen Chao
 * @File : javaSE.com.chenchao.method.Lambda.java
 * @Software : IntelliJ IDEA
 * @since : 1.8
 */
public class Lambda {
    static class Speaker2 implements Speakable{
        //2.0版本 静态内部类
        @Override
        public void speak() {
            System.out.println("我是Speaker2");
        }
    }
    class Speaker3 implements Speakable{
        //3.0版本 成员内部类
        @Override
        public void speak() {
            System.out.println("我是Speaker3");
        }
    }
    public static void main(String[] args) {
        class Speaker4 implements Speakable {
            //4.0版本 局部内部类
            @Override
            public void speak() {
                System.out.println("我是Speaker4");
            }
        }
        new Speaker1().speak();
        new Speaker2().speak();
        new Lambda().new Speaker3().speak();
        //3.0版本 成员内部类
        new Speaker4().speak();
        //5.0版本 匿名内部类
        new Speakable() {
            @Override
            public void speak() {
                System.out.println("我是Speaker5");
            }
        }.speak();
        //6.0 函数式接口,根据上下文进行推导,把表达式看成一个对象就好
        Speakable s = () -> {
            System.out.println("我是Speaker6");

        };
        s.speak();

        //传对象，被别人调用
        sing1(System.out::println);
        Singable parseInt = (System.out::println);
        sing1(parseInt);
        //自己调用
        parseInt.sing("self");

        sing1((str)->{
            System.out.println(str);
        });
        //如果参数唯一语句唯一大小括号都可以省略
        Singable singable=str -> System.out.println(str);
        sing1(singable);
        //自己调用
        singable.sing("self");

    }
    public static void sing1(Singable s){
        //相当于先给参数，后给实现
            s.sing("123");
    }
}
class Speaker1 implements Speakable{
    //1.0版本 外部类
    @Override
    public void speak() {
        System.out.println("我是Speaker1");
    }
}
/**
 * 函数式接口
 */
@FunctionalInterface
interface Speakable{
    default void sing(){

    }
    void speak();
}
@FunctionalInterface
interface Singable{
    void sing(String str);
}